package org.tissou.client.Services;

import com.google.gwt.user.client.rpc.IsSerializable;
import com.google.gwt.user.client.ui.TreeItem;


import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

/**
 * Created by IntelliJ IDEA.
 * User: Manu
 * Date: 15 mars 2009
 * Time: 10:40:56
 * To change this template use File | Settings | File Templates.
 */
public class CategorieInfos implements IsSerializable {

  private String nom;

  private int numero;

  private List<CategorieInfos> enfants = new ArrayList<CategorieInfos>();

  public CategorieInfos(String nom, int numero, List<CategorieInfos> enfants) {
    this.nom = nom;
    this.numero = numero;
    this.enfants = enfants;
  }

  public CategorieInfos(String nom, int numero) {
    this.nom = nom;
    this.numero = numero;
  }

  public CategorieInfos() {
    nom = "";
    numero = -1;
  }

  public String getNom() {
    return nom;
  }

  public void setNom(String nom) {
    this.nom = nom;
  }

  public int getNumero() {
    return numero;
  }

  public void setNumero(int numero) {
    this.numero = numero;
  }

  public List<CategorieInfos> getEnfants() {
    return enfants;
  }

  /**
     * Parcours l'arbre des descendant et renvoie tous les numeros rencontres.
     * Vachement utile pour ecrire SELECT blahblah WHERE Categorie IN (bim la liste)
     * quand on veut selectionner toutes les transactions relatives a telle ou telle categorie.
     *
     * @return une liste d'entiers (les numeros des categories)
     */
    public List<CategorieInfos> toutesLesCategoriesDansLaDescendance() {
      return toutesLesCategoriesDansLaDescendanceAide(new LinkedList<CategorieInfos>(), this);
    }

    private List<CategorieInfos> toutesLesCategoriesDansLaDescendanceAide(List<CategorieInfos> listePartielle,
                                                                          CategorieInfos categorie) {
      listePartielle.add(categorie);
      for (CategorieInfos enfant : categorie.getEnfants()) {
        toutesLesCategoriesDansLaDescendanceAide(listePartielle, enfant);
      }
      return listePartielle;
    }


  public String getDescendanceSousFormeDeString(){
    StringBuilder s = new StringBuilder();
    s.append("'").append(this.getNom()).append("'");
    
    for (CategorieInfos c : toutesLesCategoriesDansLaDescendance()){
      s.append(", '").append(c.getNom()).append("'");
    }
    return s.toString();
  }

  public void setEnfants(List<CategorieInfos> enfants) {
    this.enfants = enfants;
  }

  public void AjouterEnfant(CategorieInfos nouvelle) {
    enfants.add(nouvelle);
  }

  public TreeItem donneLaStructureGWTTree() {
    TreeItem moi = new TreeItem(getNom());
    moi.setUserObject(this);
    for (CategorieInfos enfant : enfants) {
      moi.addItem(enfant.donneLaStructureGWTTree());
    }

    return moi;
  }
}
